home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / aztecnos.arc / SMISC.C < prev    next >
Encoding:
C/C++ Source or Header  |  1989-03-18  |  3.3 KB  |  168 lines

  1. /* Miscellaneous servers */
  2. #include <stdio.h>
  3. #include "global.h"
  4. #include "mbuf.h"
  5. #include "socket.h"
  6. #include "proc.h"
  7. #include "remote.h"
  8.  
  9. extern FILE *Logfp;
  10. extern int errno;
  11.  
  12. static void discserv(),echoserv();
  13. static int Rem = -1;
  14. static int Sdisc = -1;
  15. static int Secho = -1;
  16.  
  17. /* Start up TCP discard server */
  18. dis1(argc,argv)
  19. int argc;
  20. char *argv[];
  21. {
  22.     struct sockaddr_in lsocket;
  23.     int s;
  24.  
  25.     psignal(Curproc,0);     /* Don't keep the parser waiting */
  26.     chname(Curproc,"Discard listener");
  27.  
  28.     lsocket.sin_family = AF_INET;
  29.     lsocket.sin_addr.s_addr = Ip_addr;
  30.     if(argc < 2)
  31.         lsocket.sin_port = IPPORT_DISCARD;
  32.     else
  33.         lsocket.sin_port = atoi(argv[1]);
  34.     Sdisc = socket(AF_INET,SOCK_STREAM,0);
  35.     bind(Sdisc,(char *)&lsocket,sizeof(lsocket));
  36.     listen(Sdisc,1);
  37.     for(;;){
  38.         if((s = accept(Sdisc,NULLCHAR,(int *)NULL)) == -1)
  39.             break;    /* Service is shutting down */
  40.  
  41.         /* Spawn a server */
  42.         newproc("Discard server",576,discserv,s,NULL);
  43.     }
  44. }
  45. static void
  46. discserv(s,unused)
  47. int s;
  48. void *unused;
  49. {
  50.     struct mbuf *bp;
  51.  
  52.     sockowner(s,Curproc);
  53.     log(s,"open discard");
  54.     while(recv_mbuf(s,&bp,0,0,NULLCHAR,NULL) > 0)
  55.         free_p(bp);
  56.     log(s,"close discard");
  57.     close_s(s);
  58. }
  59. dis0()
  60. {
  61.     if(Sdisc != -1){
  62.         close_s(Sdisc);
  63.         Sdisc = -1;
  64.     }
  65. }
  66. /* Start up TCP echo server */
  67. echo1(argc,argv)
  68. int argc;
  69. char *argv[];
  70. {
  71.     struct sockaddr_in lsocket;
  72.     int s;
  73.  
  74.     psignal(Curproc,0);     /* Don't keep the parser waiting */
  75.     chname(Curproc,"Echo listener");
  76.  
  77.     lsocket.sin_family = AF_INET;
  78.     lsocket.sin_addr.s_addr = Ip_addr;
  79.     if(argc < 2)
  80.         lsocket.sin_port = IPPORT_ECHO;
  81.     else
  82.         lsocket.sin_port = atoi(argv[1]);
  83.     Secho = socket(AF_INET,SOCK_STREAM,0);
  84.     bind(Secho,(char *)&lsocket,sizeof(lsocket));
  85.     listen(Secho,1);
  86.     for(;;){
  87.         if((s = accept(Secho,NULLCHAR,(int *)NULL)) == -1)
  88.             break;    /* Service is shutting down */
  89.  
  90.         /* Spawn a server */
  91.         newproc("Echo server",2048,echoserv,s,NULL);
  92.     }
  93. }
  94. static void
  95. echoserv(s,unused)
  96. int s;
  97. void *unused;
  98. {
  99.     struct mbuf *bp;
  100.  
  101.     sockowner(s,Curproc);
  102.     log(s,"open echo");
  103.     while(recv_mbuf(s,&bp,0,0,NULLCHAR,NULL) > 0)
  104.         send_mbuf(s,bp,0,NULLCHAR,0);
  105.  
  106.     log(s,"close echo");
  107.     close_s(s);
  108. }
  109. echo0()
  110. {
  111.     if(Secho != -1){
  112.         close_s(Secho);
  113.         Secho = -1;
  114.     }
  115. }
  116. /* Start remote exit/reboot server */
  117. rem1(argc,argv)
  118. int argc;
  119. char *argv[];
  120. {
  121.     struct sockaddr_in lsocket,fsock;
  122.     int i;
  123.     char command;
  124.     struct mbuf *bp;
  125.  
  126.     psignal(Curproc,0);
  127.     chname(Curproc,"Remote listener");
  128.     lsocket.sin_family = AF_INET;
  129.     lsocket.sin_addr.s_addr = Ip_addr;
  130.     if(argc < 2)
  131.         lsocket.sin_port = IPPORT_REMOTE;
  132.     else
  133.         lsocket.sin_port = atoi(argv[1]);
  134.     
  135.     Rem = socket(AF_INET,SOCK_DGRAM,0);
  136.     bind(Rem,(char *)&lsocket,sizeof(lsocket));
  137.     for(;;){
  138.         i = sizeof(fsock);
  139.         recv_mbuf(Rem,&bp,0,0,(char *)&fsock,&i);
  140.         command = pullchar(&bp);
  141.         free_p(bp);
  142.         switch(uchar(command)){
  143. #ifdef    MSDOS    /* Only present on PCs running MSDOS */
  144.         case SYS_RESET:
  145.             log(Rem,"%s - REMOTE RESET",
  146.              psocket((struct sockaddr *)&fsock));
  147.             iostop();
  148.             sysreset();
  149.             break;    /* Not necessary */
  150. #endif
  151.         case SYS_EXIT:
  152.             log(Rem,"%s - REMOTE EXIT",
  153.              psocket((struct sockaddr *)&fsock));
  154.             iostop();
  155.             exit(0);
  156.             break;
  157.         }
  158.     }
  159. }
  160. rem0()
  161. {
  162.     if(Rem != -1){
  163.         close_s(Rem);
  164.         Rem = -1;
  165.     }
  166. }
  167.  
  168.